
var DEBUG = true;

var allowAlertPermission = function(handler) {
	if(window.webkitNotifications){
		if(window.webkitNotifications.checkPermission() !== 0){
			window.webkitNotifications.requestPermission();
		}
	}
};
allowAlertPermission(function(){}); // popupの許可のみ行う

/**
 *
 * @require 
 *
 */
var MixiOAuth = function() {
	this.initialize.apply(this, arguments);
};
MixiOAuth.prototype = {
	consumerKey : '9d03b8ad7ca1de2667c0',
	// consumerSecret はサーバー保持を行いたい
	
	refreshToken : null,
	accessToken : null,

	fqdn : '/',
	getAccessTokenUrl : 'tokenrequest',
	refreshAccessTokenUrl: 'refreshaccesstoken',

	success : null,	// 成功したときに実行される関数。外部より設定する
	error : null,	// 失敗したときに実行される関数。外部より設定する
	initialize : function() {
//		var element = document.getElementById('voiceList');
	},
	// success, error 関数がセットされているかどうか
	undefinedFuncErrorCheck : function() {
		var notYetSet = [];
		if(this.success === null) {
			notYetSet.push('success');
		}
		if(this.error === null) {
			notYetSet.push('error');
		}
		if(notYetSet.length !== 0) {
			throw new Error('次の値がセットされていません：' + notYetSet.join(', '));
			return;
		}
	},

	// 
	start : function() {
		var self = this;
		this.undefinedFuncErrorCheck();
		// TODO: 仕様が不安定なので修正する
		var authorizationCode = parseUri(window.location.href).query.split('=')[1];
		
		/* TODO: refreshTokenを使ったaccessTokenの再発行 
		var accessToken = window.localStorage.getItem('mixi-accessToken');
		if(accessToken != null) {
			getVoiceList(accessToken);
			return;
		}
		*/
		if(authorizationCode !== undefined
			// TODO: input authorizationCode validation check
			&& /[0-9a-f]/.test(authorizationCode)
			) {
			this.getAccessToken(authorizationCode, function() {
				// 14分に一度accessTokenを取りなおす
				var refreshTimerId = setInterval(function() {
					self.refreshAccessToken();
				}, 1*60*1000); // TODO: for debug
			});
		}
	},
	getAccessToken : function(authorizationCode, successFunc) {
		var self = this;
		// refreshTokenが存在しない場合
		// refreshToken, accessToken の取得
		jQuery.ajax({
			type: 'POST',
			url: this.fqdn + this.getAccessTokenUrl,
			data: 'code=' + authorizationCode,
			success: function(resJson) {
				if(self.checkJsonError(resJson)) {
					self.setTokenToStorage(resJson);
					successFunc();
				}
				t_showObject(resJson); // TODO: for debug
			}
		});
	},
	refreshAccessToken : function() {
		var self = this;
		var refreshToken = window.localStorage.getItem('mixi-refreshToken');
		jQuery.ajax({
			type: 'POST',
			url: this.fqdn + this.refreshAccessTokenUrl,
			data: 'refresh_token=' + refreshToken,
			success: function(resJson) {
				if(self.checkJsonError(resJson)) {
					self.setTokenToStorage(resJson);
				}
				t_showObject(resJson); // TODO: for debug
			}
		});
	},
	// ajaxで取得したデータのエラーをチェック
	checkJsonError: function(resJson) {
		if(typeof resJson.error != 'undefined') {
			// authorization error
			this.error('accessToken, refreshTokenの取得に失敗しました');
			return false;
		}
		return true;
	},
	setTokenToStorage: function(resJson) {
		window.localStorage.setItem('mixi-accessToken', resJson.access_token);
		window.localStorage.setItem('mixi-refreshToken', resJson.refresh_token);
	},
};


window.addEventListener('load', function(){
	var oauth = new MixiOAuth();
	oauth.success = function(msg) {
		startPolling();
	};
	oauth.error = function(msg) {
		alert(msg);
	};
	oauth.start();
}, false);






function startPolling() {
	var accessToken = window.localStorage.getItem('mixi-accessToken');
	// TODO: accessTokenが古くなったらrefresh_tokenを使って更新する処理

	// Notificationを表示
	var showNotify = function(title, text) {
		// TODO: 一定時間した後、Notificationを閉じる処理
		window.webkitNotifications.createNotification(
			'', // image
			title,
			text
		).show()
	};

	var oldVoiceList = null;
	var pollingFunc = function() {
		console.log("polling");
		getVoiceList(accessToken, function(voiceList) {
			if(oldVoiceList == null) {
				oldVoiceList = voiceList;
			} else {
				// voiceListとoldVoiceListを見比べて、
				// コメントが付いてるものはNotificationで表示する
				console.log("-----");
				console.log(voiceList[0]);
				console.log(oldVoiceList[0]);
				for(var i=0; i<voiceList.length; i++) {
					for(var j=0; j<voiceList.length; j++) {
						if(voiceList[i].id === oldVoiceList[i].id) {
							if( parseInt(voiceList[i].reply_count) > parseInt(oldVoiceList[i].reply_count) 
								&& typeof oldVoiceList[i].repStopper === 'undefined' ) {
								showNotify(voiceList[i].user.screen_name, "返信があります。：" + voiceList[i].text);
								oldVoiceList[i].repStopper = true;
							}
							if( parseInt(voiceList[i].favorite_count) > parseInt(oldVoiceList[i].favorite_count)
								&& typeof oldVoiceList[i].favStopper === 'undefined' ) {
								showNotify(voiceList[i].user.screen_name, "いいね！通知があります。：" + voiceList[i].text);
								oldVoiceList[i].favStopper = true;
							}
						}
					}
break;
				}
				oldVoice = voiceList;
			}
		});
	};
	var pollingId = setInterval(pollingFunc , 10000);
}

function getVoiceList(accessToken, callback) {
	jQuery.ajax({
		type: 'GET',
		url: '/myvoicelist?code=' + accessToken,
/*
		beforeSend : function(xhr) {
			console.log(authCode);
			xhr.setRequestHeader('Authorization', accessToken);
		},
*/
		success: function(res) {
			callback(res);
		},
		error: function(msg) {
			console.log(msg);
		}
	});
}

// for debug
function t_showObject(obj) {
	if(!DEBUG) return;
	for(var i in obj) {
		console.log(i + " : " + obj[i]);
	}
}

/*
// Voice一覧を取得する 
var getVoiceList = function() {
	this.initialize.apply(this, arguments);
};
VoiceList.prototype = {
	initialize : function() {

	},
	getVoiceList : function() {
	}
};
*/
